<?php

namespace service\service;

use service\ext\PageData;
use service\vo\subject\Subject;
use service\vo\subject\SubjectExt;
use service\vo\subject\SubjectExtBind;

interface SubjectService
{
    const ERROR_SUBJECT_NOT_EXISTS = 'ERROR_SUBJECT_NOT_EXISTS';  //数据不存在
    const ERROR_SUBJECT_EXT_NOT_EXISTS = 'ERROR_SUBJECT_EXT_NOT_EXISTS';  //数据不存在
    const ERROR_SUBJECT_EXT_BIND_NOT_EXISTS = 'ERROR_SUBJECT_EXT_BIND_NOT_EXISTS';  //数据不存在
    const ERROR_SUBJECT_EXT_TITLE_EXISTS = 'ERROR_SUBJECT_EXT_TITLE_EXISTS';  //名称已存在

    //****************************************题目接口*********************************

    /**
     * 添加题目
     * @param Subject $subject  题目对象
     * @return int  返回新增的id
     */
    public function addSubject(Subject $subject) : int;

    /**
     * 批量添加题目
     * @param array $subjects   题目对象集合
     * @return int  添加成功的条数
     */
    public function addSubjects(array $subjects) : int;

    /**
     * 编辑题目
     * @param Subject $subject  题目对象
     * @return int  影响的行数
     */
    public function editSubject(Subject $subject) : int;

    /**
     * 删除题目
     * @param int $id 题目id
     * @return int 影响的行数
     */
    public function deleteSubjectById(int $id) : int;

    /**
     * 获取题目
     * @param int $id 题目id
     * @return Subject 题目
     */
    public function getSubjectById(int $id) : Subject;

    /**
     * 批量获取题目
     * @param array $ids    题目id集合
     * @return array    题目集合
     */
    public function getSubjectByIds(array $ids) : array;

    /**
     * 搜索题目
     * @param int $currentPage 当前页
     * @param int $pageSize 每页显示数量
     * @param array $filterCriteria //搜索条件数组，其中的value是搜索值，其中的key从下面字符串中取
     *        'LanDir'            =>    语向，CE.中译英，EC.英译中
     *        'Rate'            =>    难度系数
     *        'TerritoryId'            =>    领域id，1.公司法，可参考配置文件
     *        'SourceText'            =>    原文，模糊搜素
     *        'UserId'            =>    创建者id
     *        'UserType'            =>    创建者类型，1.管理员。2.用户
     *        'AddTime'        =>    时间，array('start'=>'开始时间','end'=>'结束时间')
     * @param array $sorterCriteria //排序条件，其中的value是搜索值，其中的key从下面字符串中取
     *        'ID'    =>    true为升序false为降序
     *        'Rand'    =>    随机
     *
     * @return PageData
     */
    public function searchSubjects(int $currentPage, int $pageSize, array $filterCriteria, array $sorterCriteria) : PageData;

    //**************************************************题目扩展表**************************************

    /**
     * 添加题目扩展
     * @param SubjectExt $subjectExt    题目扩展对象
     * @return int  新增的id
     *
     * @throws
     *  ERROR_SUBJECT_EXT_TITLE_EXISTS
     */
    public function addSubjectExt(SubjectExt $subjectExt) : int;

    /**
     * 批量添加题目扩展
     * @param array $subjectExits    题目扩展对象集合
     * @return int  添加成功的条数
     */
    public function addSubjectExits(array $subjectExits) : int;

    /**
     * 编辑题目扩展
     * @param SubjectExt $subjectExt
     * @return int
     * @throws
     *   ERROR_SUBJECT_EXT_TITLE_EXISTS
     */
    public function editSubjectExt(SubjectExt $subjectExt) : int;

    /**
     * 根据id获取题目扩展
     * @param int $id   题目扩展id
     * @return SubjectExt   题目扩展对象
     */
    public function getSubjectExtById(int $id) : SubjectExt;

    /**
     * 根据id集合获取题目扩展
     * @param array $ids  id集合
     * @return array    题目扩展集合
     */
    public function getSubjectExtByIds(array $ids) : array;

    /**
     * 根据名称获取题目扩展
     * @param string $title 题目名称
     * @return SubjectExt| null   题目扩展对象
     */
    public function getSubjectExtByTitle(string $title) : SubjectExt | null;

    /**
     * 根据id删除题目扩展
     * @param int $id   题目扩展id
     * @return int  影响的行数
     */
    public function deleteSubjectExtById(int $id) : int;

    /**
     * 批量删除题目扩展
     * @param array $ids id集合
     * @return int  影响的行数
     */
    public function deleteSubjectExtByIds(array $ids) : int;

    /**
     * 搜索题目扩展
     * @param int $currentPage 当前页
     * @param int $pageSize 每页显示数量
     * @param array $filterCriteria //搜索条件数组，其中的value是搜索值，其中的key从下面字符串中取
     *        'NotIdIn'     => 不包含ID集合
     *        'Type'            =>    类型
     *        'AddTime'        =>    时间，array('start'=>'开始时间','end'=>'结束时间')
     * @param array $sorterCriteria //排序条件，其中的value是搜索值，其中的key从下面字符串中取
     *        'ID'    =>    true为升序false为降序
     *
     * @return PageData
     */
    public function searchSubjectExt(int $currentPage, int $pageSize, array $filterCriteria, array $sorterCriteria) : PageData;

    //*********************************************题目扩展绑定***********************

    /**
     * 添加题目扩展比昂定
     * @param SubjectExtBind $subjectExtBind    题目扩展绑定对象
     * @return int  新增的id
     */
    public function addSubjectExtBind(SubjectExtBind  $subjectExtBind) : int;

    /**
     * 批量添加题目扩展绑定
     * @param array $subjectExtBinds    题目扩展绑定集合
     * @return int  新添加的条数
     */
    public function addSubjectExtBinds(array $subjectExtBinds) : int;

    /**
     * 根据题目id和扩展的id集合添加题目扩展绑定
     * @param int $subjectId    题目id
     * @param array $extIds 扩展id集合
     * @return int  新添加的条数
     */
    public function addSubjectExtBindsBySubjectIdAndExtIds(int $subjectId, array $extIds) : int;

    /**
     * 删除题目扩展绑定
     * @param int $id   id
     * @return int  影响的行数
     */
    public function deleteSubjectExtBindById(int $id) : int;

    /**
     * 批量删除题目扩展绑定
     * @param array $ids
     * @return int
     */
    public function deleteSubjectExtBindByIds(array $ids) : int;

    /**
     * 删除扩展下所有的绑定信息
     * @param int $extId
     * @return int
     */
    public function deleteSubjectExtBindByExtId(int $extId) : int;

    /**
     * 获取题目扩展绑定
     * @param int $id   id
     * @return SubjectExtBind   题目扩展绑定集合
     */
    public function getSubjectExtBindById(int $id) : SubjectExtBind;

    /**
     * 批量获取题目扩展
     * @param int $ids  题目扩展绑定id集合
     * @return array 题目扩展绑定对象
     */
    public function getSubjectExtBindByIds(int $ids) : array;

    /**
     * 获取题目下所有的绑定
     * @param int $subjectId 题目id
     * @return array    题目扩展绑定对象
     */
    public function getSubjectExtBindsBySubjectId(int $subjectId) : array;

    /**
     * 设置绑定另见属性
     * @param int $id   id
     * @param string $type  属性值
     * @return int  影响的行数
     */
    public function setSubjectExtBindTypeById(int $id, string $type) : int;
}